package com.pan.common.interview.thread.synchronize;

/**
 * @author by panstark
 * @description
 * @notice
 * @date 2020/12/25
 */
public class SynchronizedInfo {

    /**
     * java对象头和Monitor是实现对象锁的基础
     * Monitor：每一个java对象天生自带的锁 -->Synchronized的重量级锁即指向Monitor锁（monitorenter，monitorexit）-->依赖于操作系统Mutex Lock实现
     * Synchronized是可重入的
     */

    /**
     * 对象在内存中的布局
     * 1、对象头
     * 2、实例数据
     * 3、对齐填充
     */

    /**
     * 对象头：
     * 1、Mark Word 用来存储对象的hashcode、分代年龄、锁类型、锁标志位等
     * 2、Class MetaData Address 类型指针指向对象的类元数据，jvm通过此指针确定类对象
     */

    /**
     * Mark Word 被设计为一个非固定数据结构，以便存储更多信息
     */

    /**
     * 自旋锁
     * 许多情况下，共享数据锁定时间很短，切换线程不值得
     * 通过让线程执行循环等待锁释放，不放弃cpu时间
     * 缺点：若锁时间很长，会占用更多的系统开销
     */

    /**
     * 自适应自旋锁
     * 自旋的次数不再固定
     * 由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定
     */

    /**
     * 锁消除
     * JIT编译时，对运行上下文进行扫描，去除不可能存在竞争的锁
     */

    /**
     * 锁粗化
     * 通过增加锁范围，避免频繁的加锁、解锁
     */

    /**
     * 锁膨胀方向：
     * 无锁-->偏向锁-->轻量级锁-->重量级锁
     */


}
